﻿#include <stdio.h>
#include<stdlib.h>
#include"avltree.h"

//比较函数的接口，用于比对传入的key和
//avl树节点的data，并返回大小关系
int cmp_int(void* d1,void* d2){
    int* n1 = (int*)d1;
    int* n2 = (int*)d2;

    if(*n1>*n2)
        return 1;
    if(*n1<*n2)
        return -1;
    return 0;
}

int main() {

    //定义avl
    AvlTree tree;

    //初始化avl
    init_avltree(&tree);

    //模拟插入操作
    srand(192300491);
    for(int i=0;i<10;++i){
        //生成随机数
        int rd_num = rand()%1000;
        //插入运算
        insert_avltree(&tree,&rd_num,sizeof(int),cmp_int);
    }

    //定义迭代器
    AvlIterator iterator;

    //初始化迭代器，设定为首部开始
    init_iterator_avltree(&tree,&iterator,0);

    //前向迭代
    int* it_data;
    while((it_data= next_avltree(&iterator))){
        printf("%d\n",*it_data);
    }

    printf("-------------------------\n");

    //后向迭代，此过程没有初始化迭代器
    while((it_data = prev_avltree(&iterator))){
        printf("%d\n",*it_data);
    }

    printf("-------------------------\n");

    //模拟随机迭代行为
    for(int i=0;i<20;++i){
        if(rand()%1000<500){
            it_data = next_avltree(&iterator);
        }else{
            it_data = prev_avltree(&iterator);
        }

        //判断是否到达了2个尾部，数据有效才打印
        if(it_data){
            printf("%d\n",*it_data);
        }else{
            printf("NULL\n");
        }
    }


    //销毁二叉树
    destroy_avltree(&tree,1);

    return 0;
}
